#include "BlockQueue.hpp"
#include <unistd.h>
#include "Task.hpp"
void *consumer(void *args) // 消费者
{
    BlockQueue<task_t> *bq = static_cast<BlockQueue<task_t> *>(args);
    while (true)
    {
        sleep(10);
        // 从阻塞队列中奖数据拿出来
        // 2. 处理任务 -- 处理任务的时候，这个任务，已经被拿到线程的上下文中了,不属于队列了
        task_t t = bq->Pop();
        t();
    }
}
void *productor(void *args) // 生产者
{
    BlockQueue<task_t> *bq = static_cast<BlockQueue<task_t> *>(args);

    while (true)
    {
        std::cout << "生产了一个任务: " << std::endl;
        // 将数据交给阻塞队列
        bq->Equeue(Download);
    }
}
int main()
{
    // 申请阻塞队列
    BlockQueue<task_t> *bq = new BlockQueue<task_t>();

    // 构建生产消费
    pthread_t c[2], p[3]; // 两个线程分别表示生产者和消费者
    pthread_create(c, nullptr, consumer, bq);
    pthread_create(c + 1, nullptr, consumer, bq);
    pthread_create(p, nullptr, productor, bq);
    pthread_create(p + 1, nullptr, productor, bq);
    pthread_create(p + 2, nullptr, productor, bq);

    pthread_join(c[0], nullptr);
    pthread_join(c[1], nullptr);
    pthread_join(p[0], nullptr);
    pthread_join(p[1], nullptr);
    pthread_join(p[2], nullptr);
    return 0;
}